package proxy.jdk;

import proxy.jdk.GeneralEntity;
import proxy.jdk.Interface;
import proxy.jdk.JdkProxyAgency;

/**
 * 代理模式
 * 静态代理：类似于装饰者模式
 * 动态代理：JDK动态代理，CGLib
 * JDK动态代理：
 *  java提供的Proxy类，静态方法newProxyInstance可以创建代理对象
 *  需要类加载器、class对象和执行句柄InvocationHandler
 *  InvocationHandler中有invoke方法，当被代理对象执行原方法时，就会执行invoke中的功能
 *  1. 拿到被代理对象的引用，反射获得所有接口
 *  2. 通过JDK Proxy类重新生成新的类，新的类要实现被代理类所有接口
 *  3. 动态生成Java代码，编译为新的.class，并加载到JVM中
 *  即接口实现
 * CGLIB：继承被代理对象
 */
public class ProxyTest {

    public static void main(String[] args) {
        JdkProxyAgency proxyAgency = new JdkProxyAgency();
        Interface proxy = (Interface) proxyAgency.getInstance(new GeneralEntity());
        proxy.run();
    }

}
